// import type { IHitTestCellTypeHitInfo } from '@grapecity/spread-sheets'
// import * as GC from '@grapecity/spread-sheets'

// const spreadNS = GC.Spread.Sheets
// interface IHitInfo extends IHitTestCellTypeHitInfo {
//   x: number
//   y: number
//   row: number
//   col: number
//   cellRect: any
//   sheetArea: GC.Spread.Sheets.SheetArea
//   isReservedLocation: boolean
//   sheet: GC.Spread.Sheets.Worksheet
// }

// class HeaderCheckBoxCellType extends spreadNS.CellTypes.CheckBox {
//   private _isMouseDown: boolean = false

//   constructor() {
//     super()
//     this.caption('')
//   }

//   paint(
//     ctx: CanvasRenderingContext2D,
//     value: any,
//     x: number,
//     y: number,
//     width: number,
//     height: number,
//     style: GC.Spread.Sheets.Style,
//     context: {
//       sheet: GC.Spread.Sheets.Worksheet
//       row: number
//       col: number
//       sheetArea: GC.Spread.Sheets.SheetArea
//     },
//   ): void {
//     const tag = !!(context.sheet.getTag(context.row, context.col, context.sheetArea) || false)
//     super.paint(ctx, tag, x, y, width, height, style, context)
//   }

//   getHitInfo(
//     x: number,
//     y: number,
//     cellStyle: GC.Spread.Sheets.Style,
//     cellRect: any,
//     context: {
//       sheet: GC.Spread.Sheets.Worksheet
//       row: number
//       col: number
//       sheetArea: GC.Spread.Sheets.SheetArea
//     },
//   ): IHitInfo | null {
//     if (context) {
//       return {
//         x,
//         y,
//         row: context.row,
//         col: context.col,
//         cellRect,
//         sheetArea: context.sheetArea,
//         isReservedLocation: true,
//         sheet: context.sheet,
//       }
//     }
//     return null
//   }

//   processMouseDown(): boolean {
//     this._isMouseDown = true
//     return this._isMouseDown
//   }

//   processMouseUp(hitInfo: IHitInfo): boolean {
//     if (this._isMouseDown) {
//       this.doFilter(hitInfo)
//       this._isMouseDown = false
//     }
//     return true
//   }

//   private doFilter(hitInfo: IHitInfo): void {
//     const sheet = hitInfo.sheet
//     const row = hitInfo.row
//     const col = hitInfo.col
//     const sheetArea = hitInfo.sheetArea
//     const tag = sheet.getTag(row, col, sheetArea)
//     sheet.setTag(row, col, !tag, sheetArea)
//     const allData = sheet.getDataSource()
//     const newData: boolean[] = []

//     if (!tag) {
//       allData.forEach((element: any, index: number) => {
//         if (sheet.rowFilter() && sheet.rowFilter().getFilteredItems().length) {
//           newData.push(!sheet.rowFilter().isRowFilteredOut(index))
//         }
//         else {
//           newData.push(true)
//         }
//       })
//     }
//     else {
//       allData.forEach(() => {
//         newData.push(false)
//       })
//     }
//     sheet.setArray(0, 0, newData)
//   }
// }

// export default HeaderCheckBoxCellType
//
// ###############################################################################################################
//

import * as GC from '@grapecity/spread-sheets'

const spreadNS = GC.Spread.Sheets

function HeaderCheckBoxCellType() {
  GC.Spread.Sheets.CellTypes.CheckBox.apply(this)
  this.caption('')
}
HeaderCheckBoxCellType.prototype = new spreadNS.CellTypes.CheckBox()
const basePaint = spreadNS.CellTypes.CheckBox.prototype.paint
HeaderCheckBoxCellType.prototype.paint = function (
  ctx,
  value,
  x,
  y,
  width,
  height,
  style,
  context,
) {
  const tag = !!(
    context.sheet.getTag(context.row, context.col, context.sheetArea) || false
  )

  basePaint.apply(this, [ctx, tag, x, y, width, height, style, context])
}
HeaderCheckBoxCellType.prototype.getHitInfo = function (
  x,
  y,
  cellStyle,
  cellRect,
  context,
) {
  if (context) {
    return {
      x,
      y,
      row: context.row,
      col: context.col,
      cellRect,
      sheetArea: context.sheetArea,
      isReservedLocation: true,
      sheet: context.sheet,
    }
  }
  return null
}
HeaderCheckBoxCellType.prototype.processMouseDown = function () {
  this._isMouseDown = true
  return this._isMouseDown
}
HeaderCheckBoxCellType.prototype.processMouseUp = function (hitInfo) {
  if (this._isMouseDown) {
    doFilter(hitInfo)
    this._isMouseDown = false
  }
  return true
}
// 选择数据
function doFilter(hitInfo) {
  const sheet = hitInfo.sheet
  const row = hitInfo.row
  const col = hitInfo.col
  const sheetArea = hitInfo.sheetArea
  const tag = sheet.getTag(row, col, sheetArea)
  sheet.setTag(row, col, !tag, sheetArea)
  const allData = sheet.getDataSource()
  const newData = []
  if (!tag) {
    allData.forEach((element, index) => {
      // 筛选后 全选筛选数据 判断
      if (sheet.rowFilter() && sheet.rowFilter().getFilteredItems().length) {
        if (!sheet.rowFilter().isRowFilteredOut(index)) {
          newData.push(true)
        }
        else {
          newData.push(false)
        }
      }
      else {
        newData.push(true)
      }
    })
  }
  else {
    allData.forEach(() => {
      newData.push(false)
    })
  }
  sheet.setArray(0, 0, newData)
}

export default HeaderCheckBoxCellType
